#include <iostream>
#include "Array.h"
#include <cstring> // for memcpy

using namespace std;

int Array::IndexERROR = 9999 ; // 初始化索引错误的标志

//默认构造函数
Array::Array(){
    data = new int[DEFAULT_SIZE]; // 初始化数组大小为4
    size = DEFAULT_SIZE; // 设置数组大小
    itemNum = 0; // 初始化实际存储的元素个数为0

    cout << "Array default constructor called." << endl;
}

//带参构造函数
Array::Array(uint32_t size) {
    data = new int[size]; // 根据传入的大小初始化数组
    this->size = size; // 设置数组大小
    itemNum = 0; // 初始化实际存储的元素个数为0

    cout << "Array parameterized constructor called with size: " << size << endl;
    
}

//拷贝构造函数 Array a = b;参数是一个Array对象的引用，要实现深拷贝
Array::Array(const Array &t) {
    data = new int[t.size]; // 分配新的内存空间
    size = t.size; // 设置数组大小
    itemNum = t.itemNum; // 设置实际存储的元素个数

    for(int i=0;i<size;i++){
        data[i] = t.data[i]; // 深拷贝数据
    }
    cout << "Array copy constructor called." << endl;
}

//析构函数
Array::~Array(){
    if(data)
        delete[] data; // 释放动态分配的内存
    cout << "Array destructor called." << endl;
}

//返回数组的大小
uint32_t Array::get_size() const{
    return size; // 返回数组大小
}

uint32_t Array::get_itemNum() const {
    return itemNum; // 返回实际存储的元素个数
}

/*
@breaf 获取指定位置的元素
@param index 元素的索引
@return 返回指定位置的元素
*/
int Array::get_data(uint32_t index){
    if(index < size){
        return data[index]; // 返回指定位置的元素
    } else {
        cout << "Index out of bounds." << endl;
        return IndexERROR; // 如果索引越界，返回错误标志
    }

}

void Array::extend(){
    int *tmp = data; // 保存原来的数据指针
    data = new int[size *2]; // 扩容为原来的两倍
    memcpy(data, tmp, sizeof(int) * size); // 将原来的数据复制到新的内存空间
    size *= 2; // 更新数组大小
    delete[] tmp;// 释放原来的内存空间
}

void Array::destroy(){
    if(data){
        delete[] data; // 释放动态分配的内存
        data = nullptr; // 将指针置为nullptr 防止在析构函数中重复释放
        size = 0; // 重置数组大小
        itemNum = 0; // 重置实际存储的元素个数
    }
}

/*
*@breaf 在指定位置插入元素
*@param index 插入位置的索引
*@param value 要插入的元素值
@return 无返回值
*/
void Array::insert(uint32_t index, int value){
    //index >= size
    if(index >= size){
        //数组满或不满
        // 如果数组满了，扩容，然后再下标size的位置插入一个元素
        if(itemNum == size){
            extend(); // 扩容
            data[itemNum] = value;//在数组的最后一个位置插入元素
            itemNum++; // 更新实际存储的元素个数
        }
        else{//数组不满，则在下标为itemNum的位置插入
            data[itemNum] = value; // 在实际存储的元素个数的位置插入元素
            itemNum++; // 更新实际存储的元素个数
        }
    }
    else{
        //index < size
        if(itemNum == size){ // 如果数组满了，扩容
            extend(); // 扩容
        
        //将index位置及之后的元素后移一位
            for(uint32_t i = itemNum; i > index; i--){
                data[i] = data[i-1]; // 后移一位
            }
            data[index] = value; // 在指定位置插入元素
            itemNum++; // 更新实际存储的元素个数
        }
        else{
            //如果数组不满，则直接在指定位置插入元素
            for(uint32_t i = itemNum; i > index; i--){
                data[i] = data[i-1]; // 后移一位
            }
            data[index] = value; // 在指定位置插入元素
            itemNum++; // 更新实际存储的元素个数
        }
    } 

}


/*
@breaf 在指定位置删除元素
@param index 要删除的元素的索引
@return 无返回值
*/
bool Array::remove_index(uint32_t index){
    if(index >= itemNum)
        return false;
    for(int i = 0; i < itemNum - 1;i++){
        if(i >= index){
            data[i] = data[i+1]; // 将后面的元素前移一位
        }
    }
    itemNum--;
    return true;
}

void Array::remove_data(int value){
    int i = 0;
    while(i < itemNum){
        if(data[i]!=value){
            i++;
            continue; // 如果当前元素不是要删除的元素，继续下一个元素
        }else{
            for(int j = i;j < itemNum - 1;j++){
                data[j] = data[j+1]; // 将后面的元素前移一位
            }
            itemNum--;
        }
    }
}